iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
ChatGPT & Codex

AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent系列 第 7

[Day 07] 讓 SubWise 真正「記住資料」:Google Sheets CRUD 與資料層模組化

  • 分享至 

  • xImage
  •  

前言

前一天,我已經完成 Google Cloud、Service Account、憑證設定,也成功讓 Python 連上自己的 Google Sheets。不過到了這裡,我開始思考一個問題:

「連得上 Google Sheets,真的就代表 SubWise 已經有資料庫了嗎?」

答案其實是否定的。如果只是能夠連線,卻不能新增、讀取、修改與刪除資料,那距離真正可以使用的資料層還有一段距離。

因此 Day 07 今天完成的內容包含:Google Sheets 新增資料、讀取資料、修改資料、刪除資料,並把資料操作抽成獨立的 google_sheets.py 模組,最後再做一次完整的 CRUD 整合測試。目標是讓今天的成果從「Python 可以寫資料」,提升到「SubWise 已經具備一個可以被後續功能使用的資料層」。


先確認 SubWise Database

Day 06 建立的 Google Sheet「SubWise Database」裡目前規劃了三個工作表:ExpensesSubscriptionsSettings。今天主要先使用 Expenses 作為消費紀錄的資料表,欄位如下:

Date Category Amount Note
2026-08-08 Food 120 Lunch

這個資料結構看起來很簡單,但其實已經是在替之後的 AI 記帳功能做準備。未來使用者只需要對 LINE Bot 說「今天午餐 120 元」,Gemini 就能協助把自然語言轉成結構化資料(Date / Category / Amount / Note),最後交給 Google Sheets 儲存。今天就是先把「資料庫這一端」準備好。


今日實作實錄

一、第一次成功寫入資料

先測試最基本的 Create,執行後成功看到:

🎉 資料寫入成功!
📄 試算表:SubWise Database
📚 工作表:Expenses
💰 寫入資料: ['2026-08-08', 'Food', 120, 'Lunch']

回到 Google Sheets 確認,也確實看到了新增的資料,代表第一條資料流已經成功建立:Python → Google Sheets API → SubWise Database → Expenses。但這只是開始。

二、實作完整 CRUD

如果要讓 Google Sheets 真正扮演 SubWise 的資料庫角色,只會新增資料還不夠,因此接著把資料操作拆成 Create / Read / Update / Delete 四個基本功能:

1.Create:新增消費
2026-08-08 | Food | $120 | Lunch 這筆資料透過 Google Sheets API 新增到 Expenses

2.Read:讀取消費
測試把 Google Sheets 裡的資料讀回 Python,成功讀取到 2 筆資料,這對之後的消費統計、查詢與 AI 財務分析都非常重要。

3.Update:修改消費
使用者不可能永遠不記錯資料,因此加入修改功能,成功將原本記成 $120 的一筆資料改成 $150

4.Delete:刪除資料
加入一筆測試資料後,透過 Python 刪除指定資料列,確認可以正確移除。

至此,Google Sheets 的四種基本資料操作全部完成:Create ✅ Read ✅ Update ✅ Delete ✅

三、建立 Google Sheets 資料層

功能都成功了,但專案開始出現很多測試檔案(write_google.pyread_google.pyupdate_google.pydelete_google.py...),這些程式本質上都在做同一件事:操作 Google Sheets。如果照這個方式一直增加檔案,專案很快就會難以維護,因此決定趁功能還不多,先做一次小型重構。

建立 google_sheets.py 將 Google Sheets 的操作集中管理,提供:

get_worksheet()
add_expense()
get_expenses()
update_expense()
delete_expense()

這樣未來 app.py 想操作資料,不需要自己處理 Google Sheets API 的細節,只要呼叫對應函式即可。整個架構變得清楚:
LINE Bot → app.py → google_sheets.py → Google Sheets → SubWise Database

四、模組化後的重新測試

完成 google_sheets.py 後,建立測試程式確認新的資料層是否正常運作,執行 python test_sheets_module.py,成功得到:

🚀 開始測試 Google Sheets 資料層

1️⃣ Create:新增資料
✅ 新增成功

2️⃣ Read:讀取資料
{'Date': '2026-08-08', 'Category': 'Food', 'Amount': 150, 'Note': 'Lunch'}
{'Date': '2026-08-08', 'Category': 'Transport', 'Amount': 50, 'Note': 'MRT'}
✅ 目前共有 2 筆資料

🎯 Google Sheets 資料層測試完成!

代表把程式抽成模組後,原本的功能仍然正常。

五、完整 CRUD 整合測試

為了確認不是單獨測試某一個功能,而是真的可以把整個資料流程串起來,建立 test_crud.py,一次測試 Create → Read → Update → Read → Delete 完整流程:新增 Entertainment | $300 | Movie,讀取確認共 3 筆資料,修改最後一筆金額 300 → 350,最後刪除測試資料。完整 CRUD 測試成功~


憑證安全提醒

Service Account 產生的 credentials.json 不能直接丟到 GitHub。除了在 .gitignore 中確認已加入 credentials.json,這次額外使用 git check-ignore credentials.json 驗證,確認結果顯示 credentials.json,代表 Git 確實會忽略這個憑證檔案。功能能跑是一回事,敏感資訊是否安全是另一回事——尤其現在開始接觸更多 API Key 與憑證,這個習慣需要一直維持下去。


整理專案結構

完成測試後,把開發過程中產生的重複測試檔整理掉(write_google.pyread_google.pyupdate_google.pydelete_google.pytest_sheets_module.py),最後留下:

SubWise/
├── app.py
├── google_sheets.py
├── test_google.py
├── test_crud.py
├── requirements.txt
├── .gitignore
├── .env
├── credentials.json
└── venv/

真正重要的程式碼是 app.py → google_sheets.py → Google Sheets,而 test_google.pytest_crud.py 分別負責 Day 06 的環境驗證與 Day 07 的 CRUD 測試。


今日成果整理

  • Google Sheets API 串接
  • Service Account 驗證
  • Expenses 工作表
  • Python 新增 / 讀取 / 修改 / 刪除資料
  • CRUD 整合測試
  • 建立 Google Sheets 資料層(google_sheets.py)
  • 專案結構整理
  • 憑證 .gitignore 保護
  • Git Commit / GitHub Push

今天最大的成果不是「成功寫入一筆資料」,而是:SubWise 現在已經有一個可以被後續 AI 記帳功能使用的資料層。

模組化後的重新測試:
https://ithelp.ithome.com.tw/upload/images/20260808/20178527NMxtLB64xh.png
完整 CRUD 整合測試:
https://ithelp.ithome.com.tw/upload/images/20260808/20178527QilNFD6rM5.png


今天踩到的坑

1.只會寫入,其實離「資料庫」還很遠
一開始可能會覺得「資料成功寫進 Google Sheets,不就完成了嗎?」但真正開始思考記帳工具的需求後,會發現還需要查詢資料、修改錯誤資料、刪除測試資料、後續進行統計,所以才進一步把 CRUD 全部補齊。

2.測試程式越寫越多
一開始每個功能各寫一個測試檔,非常直觀,但當檔案越來越多後,反而開始搞不清楚「到底哪一個才是正式程式」。這讓我第一次很明顯感受到:能執行的程式,不代表就是好的專案結構。因此最後做了一次重構,把真正的 Google Sheets 操作集中到 google_sheets.py


明日預告

經過今天的實作,SubWise 已經從「可以連上 Google Sheets」進化成「可以完整操作 Google Sheets」,具備了完整的 Create / Read / Update / Delete 能力,這代表下一階段終於可以開始加入真正的 AI。

明天 Day 08 將正式進入 Gemini API 串接,先讓 Python 成功呼叫 Gemini API、傳送文字並取得 AI 回覆,完成 SubWise 第一次的 AI 對話。我們明天見!


上一篇
[Day 06] Google Cloud + Service Account + Sheets API:打造 SubWise 的雲端資料庫
下一篇
[Day 08] 從規則式 Bot 到 AI Agent:SubWise 首次串接 Gemini API
系列文
AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言